package com.pet.pet.app;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.pet.pet.app.parent.AncestorsProcessor;
import com.pet.pet.entity.UPetEntity;
import com.pet.pet.entity.UPetUrlEntity;
import com.pet.pet.utlis.UPetUnifiedV;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
/**
 * 1.两个控制点。
 * 1.1.控制用户的Cookie 不能过期，条件是 state == 1;
 * 2.执行可用的数据
 */


/**
 *
 *
 * 1. 后台可以手动执行动作，（开始执行某个动作，停止执行某个动作）
 * 2.定时执行，应该可以自动到点执行某个动作，
 *  2.1： 比如早上六点开始执行所有可用账号，晚上八点再次执行一次，
 *      时间可以进行管理
 *
 *
 */
@RestController
public class PetProcessor extends AncestorsProcessor {

    private static final String URL_KEY = "pet:url:PET-URL-KEY";
    private static final Integer URL_REFRESH = 1;
    private static final Integer OK = 0;
    private static final Integer FAIL = -5;
    private static final String RESULT_CODE_KEY = "result";
    private static final String RESULT_MSG_KEY = "msg";



    private void petProcessor(){
        for (UPetEntity availableUPetEntity : getAvailableUPetEntities()) {

        }
    }


    /**
     * 系统加载会先把所有的接口路径缓存到，redis，后续需要接口只需要调用次方法
     * @return
     */
    private List<UPetUrlEntity> getPetUrlEntities() {
        return redisUtils.getTransformationList(URL_KEY, UPetUrlEntity.class);
    }

    /**
     * 通过这个方法可以取得具体某一个 请求接口,每个type代表一个接口
     * @param type
     * @return
     */
    private String getUrlByType(Integer type) {
        for (UPetUrlEntity petUrlEntity : getPetUrlEntities()) {
            if (val.isEqual(petUrlEntity.getType(), type)) {
                return petUrlEntity.getUrl();
            }
        }
        return null;
    }

    /**
     * 返回可用用户
     *
     * 1.检查所有用户
     * 2.可用的收集起来
     * 3.不可用的修改状态，代表接下来执行的任务，都不用次账号，如果需要返回用户错误，让用户解决，或者后台可以手动尝试是否可用
     * 4. 最后返回所有可以用户，让接下来执行动作，避免出错
     * @return
     */
    private List<UPetEntity> getAvailableUPetEntities() {
        QueryWrapper<UPetEntity> petWQ = new QueryWrapper<>();
        petWQ.eq("state", USER_STATE_YES);
        List<UPetEntity> uPetEntities = uPetService.list(petWQ);
        /**
         * 收集可用用户
         */
        List<UPetEntity> uPetNewEntities = new ArrayList<>();
        for (UPetEntity uPetEntity : uPetEntities) {
            if (!val.isNullString(uPetEntity.getCookie()) && !val.isNullObj(uPetEntity.getUId())) {
                /**
                 *  发送校验请求
                 */
                UPetUnifiedV uPetUnifiedV = request.sendGet(getUrlByType(URL_REFRESH), uPetEntity.getUId(), uPetEntity.getCookie());
                /**
                 * 判断是否请求成功
                 */
                if (val.isEqual(uPetUnifiedV.get("code"), OK)) {
                    /**
                     * 请求成功拿到返回的json串
                     */
                    String jsonStr = (String) uPetUnifiedV.get(DATA_KEY);
                    JSONObject jsonObject = JSONObject.parseObject(jsonStr);
                    /**
                     * 判断Cookie 是否有效
                     */
                    if (!val.isEqual(jsonObject.get(RESULT_CODE_KEY), FAIL)) {
                        uPetNewEntities.add(uPetEntity);
                    } else {
                        /**
                         * 无效保存记录，修改该用户不可使用
                         */
                        saveLog((Integer) jsonObject.get(RESULT_CODE_KEY), (String) jsonObject.get(RESULT_MSG_KEY), uPetEntity.getUId(),YES);
                        modify(uPetEntity.getUId(), USER_STATE_NO);
                    }
                }
            }
        }
        return uPetNewEntities;
    }


}
